package com.fdd.op.sdk.request.api.file;

import com.fdd.op.sdk.ApiRuleException;
import com.fdd.op.sdk.BaseFddRequest;
import com.fdd.op.sdk.FddUploadRequest;
import com.fdd.op.sdk.FileItem;
import com.fdd.op.sdk.constants.Constants;
import com.fdd.op.sdk.internal.mapping.RequestField;
import com.fdd.op.sdk.internal.util.StringUtils;
import com.fdd.op.sdk.response.api.file.UploadResponse;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class UploadRequest extends BaseFddRequest<UploadResponse> implements FddUploadRequest<UploadResponse> {
    @Override
    public String getApiMethodName() {
        return "/base/api/file/upload";
    }

    @Override
    public Map<String, Object> getTextParams() {
        return null;
    }

    @Override
    public Class<UploadResponse> getResponseClass() {
        return UploadResponse.class;
    }

    @Override
    public void check() throws ApiRuleException {
        if(StringUtils.isBlank(getFileName())){
            throw new ApiRuleException("4000", "缺少必要的请求参数: fileName");
        }
        if((fileItemMap == null || fileItemMap.size() == 0) && StringUtils.isBlank(getFileUrl())){
            throw new ApiRuleException("2", "缺少必要的请求参数, file文件流与fileUrl的方式二选一，不能同时为空");
        }
        if(fileItemMap != null && fileItemMap.size() > 0 && StringUtils.isNotBlank(getFileUrl())){
            throw new ApiRuleException("34016", "file文件流与fileUrl只能二选一");
        }

    }

    @Override
    public String getHttpMethod() {
        return Constants.METHOD_POST;
    }

    @RequestField("文件流，文件流与Url的方式二选一，不允许同时选择；传文档文件，则按照文件流的方式创建文件并返回文件id；选择文件路径，则从Url中下载文件后创建文件并返回文件id")
    private File file;

    @RequestField("文件获取链接地址，文件流与Url的方式二选一，不允许同时选择；传文档文件，则按照文件流的方式创建文件并返回文件id；选择文件路径，则从Url中下载文件后创建文件并返回文件id")
    private String fileUrl;

    @RequestField("文件的摘要哈希值，当上传了摘要值时，文件上传完之后，需要先做完整性比对，若比对不上，则报错提示“文件摘要值与实际文件不匹配”")
    private String fileHash;

    @RequestField("文件完整名称（需带上文件后缀）")
    private String fileName;

    @RequestField("异步回调地址，文档上传成功后产生回调")
    private String notifyUrl;

    @RequestField("异步回调流水号")
    private String notifyNo;

    private Map<String, FileItem> fileItemMap;

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileUrl() {
        return fileUrl;
    }

    public void setFileUrl(String fileUrl) {
        this.fileUrl = fileUrl;
    }

    public String getFileHash() {
        return fileHash;
    }

    public void setFileHash(String fileHash) {
        this.fileHash = fileHash;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getNotifyNo() {
        return notifyNo;
    }

    public void setNotifyNo(String notifyNo) {
        this.notifyNo = notifyNo;
    }

    @Override
    public Map<String, FileItem> getFileParams() {
        return fileItemMap;
    }

    @Override
    public void setFileItem(String key, FileItem fileItem) {
        if(fileItemMap == null){
            fileItemMap = new HashMap<>();
        }
        fileItemMap.put(key, fileItem);
    }
}
